import os

# region db
import sqlite3
import dataset
# endregion

# region logging
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(levelname)8s: %(message)s'
)
# endregion logging

import pandas as pd
from pandas import DataFrame

from Basic import Basic


class DbBasic(Basic):

    def __init__(self, db_path: str, name_sheet_xlsx_path: str):

        self.db = dataset.Database(f'sqlite:///{db_path}')

        df_name_sheet = pd.read_excel(name_sheet_xlsx_path,
                                      usecols=['学号', '姓名', '班级'],  # type: ignore
                                      dtype={'学号': int, '姓名': str, '班级': str},
                                      header=0)
        self.__init_student_table(self.db, df_name_sheet)

        self.df_name_sheet: DataFrame = pd.DataFrame(columns=['学号', '姓名', '班级'])

    @staticmethod
    def __init_student_table(db: dataset.database.Database, df: pd.DataFrame):
        table = db['学生名单']  # 获取或创建 student 表
        existing_nos = [row['学号'] for row in table.find()]  # 提取所有已存在的学号

        # 筛选出 DataFrame 中不存在于数据库的新记录
        new_records = df[~df['学号'].isin(existing_nos)].to_dict('records')
        # ~ 表示“非”，isin(existing_nos) 检查学号是否在已存在列表中

        if new_records:
            table.insert_many(new_records)
            logging.info(f"成功插入 {len(new_records)} 条学生记录")
        else:
            logging.info("所有记录已存在，无需插入")

    def get_stu_name_sheet(self) -> DataFrame:
        if not self.df_name_sheet.empty:
            return self.df_name_sheet

        # 获取'学生名单'表对象
        student_table = self.db['学生名单']

        # 读取表中所有数据（返回字典列表）
        all_records = list(student_table.all())

        # 转换为pandas DataFrame
        if all_records:
            df = pd.DataFrame(all_records)
            # 若存在自动生成的id列（如果表中有），可选择性删除
            if 'id' in df.columns:
                df = df.drop(columns=['id'])

            self.df_name_sheet = df
        else:
            logging.info("学生名单表中没有数据")


# ------------------------------
# 使用示例
# ------------------------------
if __name__ == "__main__":
    # 数据库路径
    db_dir = "../../temp/data"
    db_name = "test.db"
    db_path = os.path.join(db_dir, db_name)
    os.makedirs(db_dir, exist_ok=True)  # 确保目录存在

    basic = DbBasic(db_path,
                    r"D:\100-Project\2025-2026-1学期安排\首义学院\19201018_《软件工程综合实践（创新创业）（企业）》\学生提交\学生名单.xlsx")
